#1 自定义类
class Student_test():
    pass
Stu_test = Student_test()

#2 类的组成
class Student:  # 括号可省略
    # 类属性：定义在类中，方法外的变量
    school = '北京XXX教育'

    # 初始方法
    def __init__(self, xm, age): # xm,age是方法的参数，是局部变量，作用域是整个__init__方法
        self.name = xm    # 将局部变量xm赋值给实例属性self.name
        self.age = age      # 实例属性名称可以和局部变量名称相同

    # 定义在类中的函数，称为方法，自带一个参数self
    def show(self):
        print(f'我叫：{self.name}。今年：{self.age}岁。')

    # 静态方法
    @staticmethod
    def sm():   # self参数如有需要，可写
        # print(self.name)    # 报错
        # self.show()  # 报错
        print('这是一个静态方法，不能调用实例属性，也不能调用实例方法')

    # 类方法
    @classmethod
    def cm(cls):    # cls --> class简写
        # print(self.name)    # 报错
        # self.show()  # 报错
        print('这是一个类方法，不能调用实例属性，也不能调用实例方法')

# 创建类的对象
stu  = Student('ZW', 18)    # __init__方法中，有两个形参，是自带的参数，无需手动输入
print(Student.school)   # 类属性，直接用类名，打点调用
print(stu.name, stu.age)    # 实例属性，使用对象名称，进行打点调用
stu.show()              # 实例方法，使用对象名称，进行打点调用
Student.sm()            # 静态方法，@staticmethod进行修饰的方法，直接用类名，打点调用
Student.cm()            # 类方法，@classmethod进行修饰的方法，直接用类名，打点调用
print('-'*50)

# 创建多个对象
stu1 = Student('张三', 18)
stu2 = Student('李四', 28)
stu3 = Student('刘莉', 38)

Student.school = '派森教育'

lst1 = [stu, stu1, stu2, stu3]
for item1 in lst1:
    item1.show()
print('-'*50)

#3 动态绑定属性和方法
print(stu1.name, stu1.age)
print(stu2.name, stu2.age)
# 动态绑定属性
stu2.gender = '男'
print(stu2.name, stu2.age, stu2.gender)

# 动态绑定方法
def introduce():
    print('我是一个普通的函数，我被动态绑定成了stu2对象的方法')
stu2.introduce = introduce  # 可同名
stu2.introduce()